package com.cs.beneficios.web.action;

import com.cs.beneficios.business.entity.AreasDAO;
import com.cs.beneficios.business.entity.AtributosDAO;
import com.cs.beneficios.business.entity.ProgramaDAO;
import com.cs.beneficios.business.entity.RepBeneficioOtorgadoDAO;
import com.cs.beneficios.business.entity.SedeDAO;
import com.cs.beneficios.business.model.AtributoVO;
import com.cs.beneficios.business.model.ProgramaVO;
import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;
import com.cs.beneficios.common.ConnectionFactory;
import com.cs.paoyer.administration.business.model.UserVO;

import java.io.IOException;

import java.sql.SQLException;

import java.util.Collection;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;


public class ReportDetEnteGestorAction extends Action {
	/**This is the main action called from the Struts framework.
	 * @param mapping The ActionMapping used to select this instance.
	 * @param form The optional ActionForm bean for this request.
	 * @param request The HTTP Request we are processing.
	 * @param response The HTTP Response we are processing.
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
								 HttpServletResponse response) throws IOException, ServletException {
		ConnectionFactory cf = new ConnectionFactory();
		HttpSession session = request.getSession();
		UserVO user = (UserVO)session.getAttribute("userInfo");
		StringBuffer msg = new StringBuffer("");

		if (session.getAttribute("BeneficiosOtorgado") != null) {
			session.removeAttribute("BeneficiosOtorgado");
		}

		Collection sedes = null;
		try {
			SedeDAO objSedeDAO = new SedeDAO(cf);
			sedes = objSedeDAO.TotalSedes();
			cf.closeConnection(objSedeDAO.getConn());
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSSPE - cwsub ********/");
		}

		if (sedes != null && sedes.size() > 0) {
			request.setAttribute("sedes", (Object)sedes);
		} else {
			request.setAttribute("msgSedes", "No se encontraron sedes vigentes a la fecha.");
		}

		Collection areas = null;
		try {
			AreasDAO objAreaDAO = new AreasDAO(cf);
			areas = objAreaDAO.getAreasAuthorizedWithGestor(String.valueOf(user.getCode()), user.getUserGroupName());
			cf.closeConnection(objAreaDAO.getConn());
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSSPE - cwsub ********/");
		}

		if (areas != null && areas.size() > 0) {
			request.setAttribute("areas", (Object)areas);
		} else {
			request.setAttribute("msgAreas","No se encontraron areas.\n");
		}

		Collection programas = null;
		String codeArea = request.getParameter("codearea");
		if (codeArea != null && !codeArea.equals("nulo") && !codeArea.equals("")) {
			try {
				ProgramaDAO objProgramaDAO = new ProgramaDAO(cf);
				ProgramaVO objProgramaVO = new ProgramaVO();
				objProgramaVO.setCodeArea(new Long(codeArea));
				programas = objProgramaDAO.findProgramaByCritereaWithGestor(
						objProgramaVO, user.getUserGroupName(), user.getCode(), user.getCodeArea()
					);
				cf.closeConnection(objProgramaDAO.getConn());

			} catch (SQLException e) {
				System.err.println("/******** TDSUB - cwsub");
				e.printStackTrace();
				System.err.println("TDSSPE - cwsub ********/");
			}
		} else {
			try {
				RepBeneficioOtorgadoDAO objBeneOtor1DAO = new RepBeneficioOtorgadoDAO(cf);
				programas = objBeneOtor1DAO.findProgramaWithGestorByUserReport(
						user.getCode(), user.getUserGroupName(), user.getCodeArea()
					);
				cf.closeConnection(objBeneOtor1DAO.getConn());
			} catch (SQLException e) {
				System.err.println("/******** TDSUB - cwsub");
				e.printStackTrace();
				System.err.println("TDSSPE - cwsub ********/");
			}
		}

		if (programas != null && programas.size() > 0) {
			request.setAttribute("programas", (Object)programas);
		} else {
			request.setAttribute("msgProgramas","No se encontraron programas vigentes a la fecha.\n");
		}

		String codePrograma = request.getParameter("codePrograma");
		if (codePrograma != null && !codePrograma.equals("nulo") && !codePrograma.equals("")) {
			Collection subprogramas = null;

			try {
				RepBeneficioOtorgadoDAO objBeneOtor2DAO = new RepBeneficioOtorgadoDAO(cf);
				subprogramas = objBeneOtor2DAO.findSubProgramaWithGestorByUserReport(
								user.getCode(), user.getUserGroupName(), codePrograma, user.getCodeArea()
					);
				cf.closeConnection(objBeneOtor2DAO.getConn());
			} catch (SQLException e) {
				System.err.println("/******** TDSUB - cwsub");
				e.printStackTrace();
				System.err.println("TDSSPE - cwsub ********/");
			}

			if (subprogramas != null && subprogramas.size() > 0) {
				request.setAttribute("subprogramas", (Object)subprogramas);
			} else {
				request.setAttribute("msgSubprogramas",
						"No se encontraron subprogramas asociados a este programa que esten vigentes.\n");
			}
		}

		String accion = request.getParameter("accion");
		if (accion != null && accion.length() > 0) {
			if (accion.equals("BuscarSiTieneAtributo")) {
				AtributosDAO atributoDAO = new AtributosDAO(cf);
				AtributoVO atributoVO = null;
				try {
					String codeSub = request.getParameter("codeSubPrograma");

					if (codeSub != null && !codeSub.equals("nulo")) {
						atributoVO = new AtributoVO();
						atributoVO = atributoDAO.GetAtributos(codeSub);
					}

					if (atributoVO != null) {
						session.setAttribute("Gestor", (Object)atributoVO.getValoresflexibles());
						session.setAttribute("codigoAtr", atributoVO.getCodigo());
					} else {
						session.removeAttribute("Gestor");
						session.removeAttribute("codigovfl");
						session.removeAttribute("codigoAtrGestor");
					}

				} catch (SQLException e) {
					System.err.println("/******** TDSUB - cwsub");
					e.printStackTrace();
					System.err.println("TDSSPE - cwsub ********/");
				}

			} else if (accion.equals("BuscarTodo")) {
				boolean continuar = true;
				StringBuffer errorFecha = new StringBuffer("");
				// fecha inicial
				String fechaini = "";
				String dia1 = request.getParameter("dia1");
				String mes1 = request.getParameter("mes1");
				String ano1 = request.getParameter("ano1");

				if (dia1 != null && mes1 != null && ano1 != null) {
					if (!dia1.equals("nulo") && !mes1.equals("nulo") && !ano1.equals("nulo")) {
						fechaini = dia1 + "/" + mes1 + "/" + ano1;
					} else if (dia1.equals("nulo") && mes1.equals("nulo") && ano1.equals("nulo")) {
						errorFecha.append("La fecha inicial no ha sido ingresada<br>");
						continuar = false;
					} else {
						errorFecha.append("La fecha inicial es incorrecta<br>");
						continuar = false;
					}
				}

				// fecha final
				String fechafinal = "";
				String dia2 = request.getParameter("dia2");
				String mes2 = request.getParameter("mes2");
				String ano2 = request.getParameter("ano2");

				if (dia2 != null && mes2 != null && ano2 != null) {
					if (!dia2.equals("nulo") && !mes2.equals("nulo") && !ano2.equals("nulo")) {
						fechafinal = dia2 + "/" + mes2 + "/" + ano2;
					} else if (dia2.equals("nulo") && mes2.equals("nulo") && ano2.equals("nulo")) {
						errorFecha.append("La fecha final no ha sido ingresada");
						continuar = false;
					} else {
						errorFecha.append("La fecha final es incorrecta");
						continuar = false;
					}
				}

				if (!fechaini.equals("") && !fechafinal.equals("")) {
					String strfinicial = ano1 + mes1 + dia1;
					String strffinal = ano2 + mes2 + dia2;
					int finicial = Integer.parseInt(strfinicial.trim());
					int ffinal = Integer.parseInt(strffinal.trim());
					if (finicial > ffinal) {
						errorFecha.append("La fecha inicial es mayor a la final");
						continuar = false;
					}
				}

				if (errorFecha.length() > 0)
					request.setAttribute("errorfecha", errorFecha.toString());

				if (continuar) {
					session.removeAttribute("beneficiosSede");

					Collection beneficioOtorgado = null;
					try {
						RepBeneficioOtorgadoVO objBeneOtorVO = new RepBeneficioOtorgadoVO();

						String codeSede = request.getParameter("code");
						if (codeSede != null && !codeSede.equals("nulo")) {
							objBeneOtorVO.setCodeSede(new Long(codeSede));
						}

						if (codePrograma != null && !codePrograma.equals("nulo")) {
							objBeneOtorVO.setCodePrograma(new Long(codePrograma));
						}

						String codeSubprograma = request.getParameter("codeSubPrograma");
						if (codeSubprograma != null && !codeSubprograma.equals("nulo")) {
							objBeneOtorVO.setCodeSubprograma(new Long(codeSubprograma));

							String codigovfl = request.getParameter("codigovfl");
							if (codigovfl != null) {
								AtributosDAO atributoDAO = new AtributosDAO(cf);
								AtributoVO atributoVO = atributoDAO.GetAtributos(codeSubprograma);

								if (atributoVO != null) {
									session.setAttribute("Gestor", (Object)(atributoVO.getValoresflexibles()));
									if (!codigovfl.equals("nulo")) {
										session.setAttribute("codigovfl", codigovfl);
										session.setAttribute("codigoAtrGestor", atributoVO.getCodigo());
										objBeneOtorVO.setGestor(codigovfl);
										objBeneOtorVO.setCodigoAtrGestor(atributoVO.getCodigo());
									} else {
										session.removeAttribute("codigovfl");
									}
								} else {
									session.removeAttribute("Gestor");
									session.removeAttribute("codigovfl");
									session.removeAttribute("codigoAtrGestor");
								}
							}
						}

						objBeneOtorVO.setDesde(fechaini);
						objBeneOtorVO.setHasta(fechafinal);

						RepBeneficioOtorgadoDAO objBeneOtorDAO = new RepBeneficioOtorgadoDAO(cf);
						beneficioOtorgado = objBeneOtorDAO.getBeneficioOtorgadoConGestor(objBeneOtorVO);
						cf.closeConnection(objBeneOtorDAO.getConn());

						if (beneficioOtorgado != null && beneficioOtorgado.size() > 0) {
							session.setAttribute("BeneficiosOtorgado", (Object)beneficioOtorgado);
						} else {
							msg.append("No hay registros que cumplan con los criterios seleccionados.\n");
						}
						objBeneOtorVO = null;
					} catch (SQLException e) {
						msg.append("Se registro un error durante la consulta.\n");
						System.err.println("/******** TDSUB - cwsub");
						e.printStackTrace();
						System.err.println("TDSSPE - cwsub ********/");
					}
				}
			}
		}

		if (msg.length() > 0)
			request.setAttribute("msg", msg.toString());

		return mapping.findForward("success");
	}
}
